from typing import Dict, Any
from .base_agent import BaseAgent
from utils import logger, CodeAnalyzer

class DeveloperAgent(BaseAgent):
    """开发者代理 - 负责代码实现和编程"""
    
    def __init__(self):
        super().__init__(
            name="开发者",
            role="高级软件工程师"
        )
        self.code_analyzer = CodeAnalyzer()
    
    def _get_system_prompt(self) -> str:
        return """你是一个资深的软件工程师，具有以下专业技能：

💻 **编程能力**：
- 精通Python、JavaScript、Java、Go等多种编程语言
- 熟悉各种框架和库（Django、Flask、React、Vue等）
- 掌握设计模式和最佳实践
- 注重代码质量和可维护性

🛠️ **开发标准**：
- 编写清晰、可读的代码
- 添加适当的注释和文档字符串
- 遵循PEP8等编码规范
- 实现错误处理和日志记录
- 考虑性能优化和安全性

📝 **代码结构**：
- 使用合适的设计模式
- 模块化和组件化设计
- 单元测试友好的代码结构
- 易于扩展和维护

🔧 **工具使用**：
- 版本控制（Git）
- 包管理器（pip、npm等）
- 测试框架（pytest、unittest等）
- 代码质量工具（pylint、black等）

请生成高质量、生产就绪的代码，包含完整的功能实现。用中文注释。"""
    
    def process(self, input_data: Dict[str, Any]) -> Dict[str, Any]:
        """根据架构设计生成代码"""
        architecture_design = input_data.get('architecture_design', '')
        requirement_analysis = input_data.get('requirement_analysis', '')
        original_requirement = input_data.get('original_requirement', input_data.get('user_input', ''))
        
        if not any([architecture_design, requirement_analysis, original_requirement]):
            return {
                'success': False,
                'error': '未提供架构设计、需求分析或原始需求'
            }
        
        # 构造代码生成提示
        prompt = f"""
基于以下信息生成完整的Python代码实现：

**原始需求**：
{original_requirement}

**需求分析**：
{requirement_analysis}

**架构设计**：
{architecture_design}

**请生成代码，要求**：

## 1. 完整实现
- 根据架构设计实现所有核心功能
- 包含主程序入口和配置文件
- 实现错误处理和日志记录

## 2. 代码质量
- 遵循PEP8编码规范
- 添加详细的中文注释和docstring
- 使用类型提示（Type Hints）
- 模块化设计，职责分离

## 3. 文件结构
按照架构设计的目录结构生成多个文件，每个文件用以下格式分隔：

```python
# === 文件名: 文件路径 ===
# 文件说明

代码内容...
```

## 4. 功能完整性
- 实现所有P0核心功能
- 包含输入验证和异常处理
- 提供使用示例或主函数

## 5. 可运行性
- 确保代码可以直接运行
- 包含必要的导入语句
- 提供清晰的运行说明

请生成生产级别的代码实现。
"""
        
        try:
            generated_code = self._call_llm(prompt)
            
            # 让模型分离代码文件
            separation_prompt = f"""
请将以下生成的代码分离成多个文件，每个文件用以下格式分隔：

```python
# === 文件名: 文件路径 ===
# 文件说明

代码内容...
```

生成的代码：
{generated_code}

请确保：
1. 正确识别每个文件的路径和内容
2. 移除所有markdown标记
3. 保持代码的完整性和格式
"""
            
            separated_code = self._call_llm(separation_prompt)
            code_files = self._parse_code_files(separated_code)
            
            # 让模型分析每个文件
            analysis_results = {}
            for file_path, code_content in code_files.items():
                analysis_prompt = f"""
请分析以下代码文件，并提供详细的分析报告：

文件路径：{file_path}

代码内容：
```python
{code_content}
```

请提供以下分析：
1. 代码统计（行数、函数数、类数等）
2. 函数列表及其功能说明
3. 类列表及其功能说明
4. 代码质量评估
5. 潜在问题和改进建议
"""
                
                try:
                    analysis = self._call_llm(analysis_prompt)
                    analysis_results[file_path] = analysis
                except Exception as e:
                    logger.error(f"分析文件 {file_path} 失败: {e}")
                    analysis_results[file_path] = {'error': str(e)}
            
            return {
                'success': True,
                'generated_code': generated_code,
                'code_files': code_files,
                'code_analysis': analysis_results,
                'summary': f'代码生成完成，共生成{len(code_files)}个文件'
            }
            
        except Exception as e:
            logger.error(f"代码生成失败: {e}")
            return {
                'success': False,
                'error': str(e),
                'summary': '代码生成失败'
            }
    
    def _parse_code_files(self, generated_code: str) -> Dict[str, str]:
        """解析生成的代码，分离不同文件"""
        files = {}
        lines = generated_code.split('\n')
        current_file = None
        current_content = []
        
        for line in lines:
            if line.strip().startswith('# === 文件名:') and line.strip().endswith('==='):
                # 保存上一个文件
                if current_file and current_content:
                    content = '\n'.join(current_content)
                    # 清理内容末尾的代码块标记
                    content = content.rstrip().rstrip('`').rstrip('python').rstrip('`')
                    files[current_file] = content
                
                # 开始新文件
                current_file = line.strip().replace('# === 文件名:', '').replace('===', '').strip()
                current_content = []
            else:
                if current_file:
                    current_content.append(line)
        
        # 保存最后一个文件
        if current_file and current_content:
            content = '\n'.join(current_content)
            # 清理内容末尾的代码块标记
            content = content.rstrip().rstrip('`').rstrip('python').rstrip('`')
            files[current_file] = content
        
        # 如果没有找到文件分隔符，将整个内容作为单个文件
        if not files:
            content = generated_code
            # 清理内容末尾的代码块标记
            content = content.rstrip().rstrip('`').rstrip('python').rstrip('`')
            files['main.py'] = content
        
        return files
    
    def optimize_code(self, code: str) -> str:
        """优化代码性能和结构"""
        prompt = f"""
请优化以下Python代码：

```python
{code}
```

优化要求：
1. 性能优化（算法复杂度、内存使用）
2. 代码结构优化（设计模式、职责分离）
3. 可读性提升（命名、注释、格式）
4. 错误处理改进
5. 安全性加强

请提供优化后的代码和优化说明。
"""
        
        return self._call_llm(prompt)
    
    def add_logging(self, code: str) -> str:
        """为代码添加日志记录"""
        prompt = f"""
为以下Python代码添加完整的日志记录：

```python
{code}
```

要求：
1. 使用Python标准logging库
2. 设置合适的日志级别（DEBUG、INFO、WARNING、ERROR）
3. 记录关键操作和错误
4. 包含日志配置和格式化
5. 保持代码原有功能不变

请提供添加日志后的完整代码。
"""
        
        return self._call_llm(prompt) 